package com.xinyue.ext;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import java.util.Map;

import com.xinyue.ext.data.EntityData;
import com.xinyue.ext.data.RootData;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 根据数据和模板创建代码文件
 */
public class CodeBuilder {
	//模板编码
	private static final String ENCODE = "UTF-8";
	//Java文件后缀名
	private static final String JAVA = ".java";

	//文件根路径
	private String autoRoot;
	
	public CodeBuilder(String autoRoot) {
		this.autoRoot = autoRoot;
	}
	
	/**
	 * 创建Java代码
	 * @param cfg
	 * @param rootDatas
	 * @throws TemplateException 
	 * @throws IOException 
	 */
	public void buildCodeFile(Configuration cfg, List<EntityData> entites) throws IOException, TemplateException {
		for (EntityData entity: entites) {
			//创建freemarker数据模型
			RootData data = RootBuilder.getInstance().build(entity);
			
			//创建JavaBean文件
			createFile(data.getBeanPath(), data.getBeanData(), cfg.getTemplate(BuildParam.beanTemp));
			//创建DAO接口文件
			createFile(data.getDaoPath(), data.getDaoData(), cfg.getTemplate(BuildParam.daoTemp));
			//创建DAO接口实现文件
			createFile(data.getImplPath(), data.getDaoData(), cfg.getTemplate(BuildParam.daoImplTemp));
		}
	}
	
	
	/**
	 * 调用对应构建器，创建代码文件
	 * @param filePath 文件路径
	 * @param root 数据
	 * @throws IOException 
	 * @throws TemplateException 
	 */
	private void createFile(String filePath, Map<String, Object> root, Template temp) throws IOException, TemplateException {
		
		File file = new File(autoRoot + "/" + filePath + JAVA);
		//如果文件不存在，则创建新文件。
		if(!file.exists()) {
			file.getParentFile().mkdirs();
			file.createNewFile();
		}
		
		//创建输出流并设置编码
		Writer out = new OutputStreamWriter(new FileOutputStream(file), ENCODE);
		temp.process(root, out);
		out.flush();
		out.close();
	}
}
